home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 April: Mac OS SDK / Dev.CD Apr 96 SDK / Dev.CD Apr 96 SDK1.toast / Development Kits (Disc 1) / AOCE / Development Tools / Sample Code / Standard Catalog Package / AddressOMini / AddressOMini.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-28  |  13.6 KB  |  568 lines  |  [TEXT/MPS ]

  1. #ifndef __TYPES__
  2. #include <Types.h>
  3. #endif
  4.  
  5. #ifndef __DIALOGS__
  6. #include <Dialogs.h>
  7. #endif
  8.  
  9. #ifndef __OCE__
  10. #include <OCE.h>
  11. #endif
  12.  
  13. #ifndef __OCEAUTHDIR__
  14. #include <OCEAuthDir.h>
  15. #endif
  16.  
  17. #ifndef __OCESTANDARDDIRECTORY__
  18. #include <OCEStandardDirectory.h>
  19. #endif
  20.  
  21. #ifndef __PALETTES__
  22. #include <Palettes.h>
  23. #endif
  24.  
  25. #ifndef __CONTROLS__
  26. #include <Controls.h>
  27. #endif
  28.  
  29. #include "AddressOMini.h"
  30.  
  31.  
  32. // constants
  33.  
  34. #define    kFindLayoutRsrcID        128
  35. #define    kGetDirectoriesDialog    128
  36. #define    kBrowseRadio            3
  37. #define    kFindRadio                4
  38. #define    kPanelItem                5
  39. #define    kActive                    0
  40. #define    kDimmed                    255
  41. #define    kInFront                (WindowPtr)-1L
  42. #define    kFindText                "\pFind"
  43. #define    kStopText                "\pStop"
  44. #define    kSelectText                "\pSelect"
  45. #define    kOpenText                "\pOpen"
  46.  
  47. enum {
  48.     kBrowsePanel,kFindPanel
  49. };
  50.  
  51.  
  52. // file globals
  53.  
  54. static short gPanelKind = kBrowsePanel;
  55.  
  56.  
  57. // prototypes
  58.  
  59. pascal void PanelUserItem(DialogPtr theDlg,short item);
  60. pascal Boolean PanelFilterEvent(DialogPtr theDlg,EventRecord *ev,short *itemHit);
  61. void RecalcFindButton(DialogPtr theDlg,SDPFindPanelHandle thePanel);
  62. void RecalcBrowseButton(DialogPtr theDlg,SDPPanelHandle thePanel);
  63.  
  64. void MyDrawDefaultButtonOutline(DialogPtr theDialog,short theItem);
  65. GDHandle MyGetDeviceFromRect(Rect *localRect);
  66. void FlashControl(DialogPtr theDialog,short item);
  67.  
  68.  
  69. Boolean AddressOMini(PackedDSSpecPtr *dsSpec,
  70.                                const RStringPtr *typesList,
  71.                                long typeCount,
  72.                                AuthIdentity identity,
  73.                                DirEnumChoices enumFlags,
  74.                                ConstStr255Param promptString)
  75. {
  76.     static Boolean gHasBeenCalled = false;    // save our rli location for the next time
  77.     static PackedRLI gInitialRLI;            // we call this function
  78.     static short gDSRefNum;
  79.     
  80.     SDPPanelHandle browsePanel;
  81.     SDPFindPanelHandle findPanel;
  82.     SDPSelectionState bSelectionState;
  83.     SDPPanelState bPanelState;
  84.     SDPFindPanelState fPanelState;
  85.     OSErr err;
  86.     DialogPtr theDlg;
  87.     short iType;
  88.     Handle iHndl;
  89.     Rect iRect;
  90.     Point upLeft;
  91.     short item;
  92.     Boolean selectedRecord;
  93.     unsigned short dsSpecSize;
  94.     
  95.     // set up prompt
  96.         
  97.     if (promptString)
  98.         ParamText(promptString,nil,nil,nil);
  99.     else
  100.         ParamText("\pSelect a Record:",nil,nil,nil);
  101.  
  102.     // get the dialog
  103.     
  104.     theDlg = GetNewDialog(kGetDirectoriesDialog,nil,kInFront);
  105.     SetPort(theDlg);
  106.  
  107.     // make panels
  108.     
  109.     GetDItem(theDlg,kPanelItem,&iType,&iHndl,&iRect);
  110.     SetDItem(theDlg,kPanelItem,iType,(Handle)PanelUserItem,&iRect);
  111.  
  112.     err = SDPNewPanel(&browsePanel,(WindowPtr)theDlg,&iRect,(gPanelKind==kBrowsePanel),
  113.                     (gPanelKind==kBrowsePanel),((gHasBeenCalled) ? & gInitialRLI : nil),
  114.                     typesList,typeCount,identity,
  115.                     enumFlags,kExactMatch,0);    
  116.     if (err!=noErr) {
  117.         DisposeDialog(theDlg);
  118.         return false;
  119.     }
  120.         
  121.     upLeft.h = iRect.left;
  122.     upLeft.v = iRect.top;
  123.     err = SDPNewFindPanel(&findPanel,(WindowPtr)theDlg,upLeft,kFindLayoutRsrcID,
  124.                     (gPanelKind==kFindPanel),(gPanelKind==kFindPanel),typesList,
  125.                     typeCount,kExactMatch,identity,1,kSDPFindPanelTextHasFocus,0);    
  126.     if (err!=noErr) {
  127. Debugger();
  128.         SDPDisposePanel(browsePanel);
  129.         DisposeDialog(theDlg);
  130.         return false;
  131.     }
  132.  
  133.     // set up radio buttons
  134.     
  135.     if (gPanelKind==kBrowsePanel) {
  136.         SetWRefCon((WindowPtr)theDlg,(long)browsePanel);
  137.         GetDItem(theDlg,kBrowseRadio,&iType,&iHndl,&iRect);
  138.         RecalcBrowseButton(theDlg,browsePanel);
  139.     }
  140.     else {
  141.         SetWRefCon((WindowPtr)theDlg,(long)findPanel);
  142.         GetDItem(theDlg,kFindRadio,&iType,&iHndl,&iRect);
  143.         RecalcFindButton(theDlg,findPanel);
  144.     }
  145.     SetCtlValue((ControlHandle)iHndl,1);
  146.     
  147.     selectedRecord = false;
  148.     do {
  149.         ModalDialog(PanelFilterEvent,&item);
  150.         switch (item) {
  151.         
  152.             case kBrowseRadio:
  153.                 if (gPanelKind!=kBrowsePanel) {
  154.                     
  155.                     // stop any finds going on
  156.                     
  157.                     if ((**findPanel).nowFinding)
  158.                         SDPStopFind(findPanel);
  159.                     
  160.                     // reset buttons
  161.                     
  162.                     GetDItem(theDlg,kBrowseRadio,&iType,&iHndl,&iRect);
  163.                     SetCtlValue((ControlHandle)iHndl,1);
  164.                     GetDItem(theDlg,kFindRadio,&iType,&iHndl,&iRect);
  165.                     SetCtlValue((ControlHandle)iHndl,0);
  166.                     
  167.                     // switch the panels
  168.  
  169.                     SDPEnableFindPanel(findPanel,false);
  170.                     SDPHideFindPanel(findPanel);
  171.                     SetWRefCon((WindowPtr)theDlg,(long)browsePanel);
  172.                     gPanelKind = kBrowsePanel;
  173.                     SDPShowPanel(browsePanel);
  174.                     SDPEnablePanel(browsePanel,true);
  175.                     
  176.                     // udpate ok button
  177.                     
  178.                     RecalcBrowseButton(theDlg,browsePanel);
  179.                     
  180.             }
  181.                 break;
  182.                 
  183.             case kFindRadio:
  184.                 if (gPanelKind!=kFindPanel) {
  185.                 
  186.                     // reset buttons
  187.                     
  188.                     GetDItem(theDlg,kFindRadio,&iType,&iHndl,&iRect);
  189.                     SetCtlValue((ControlHandle)iHndl,1);
  190.                     GetDItem(theDlg,kBrowseRadio,&iType,&iHndl,&iRect);
  191.                     SetCtlValue((ControlHandle)iHndl,0);
  192.  
  193.                     // switch the panels
  194.                     
  195.                     SDPEnablePanel(browsePanel,false);
  196.                     SDPHidePanel(browsePanel);
  197.                     SetWRefCon((WindowPtr)theDlg,(long)findPanel);
  198.                     gPanelKind = kFindPanel;
  199.                     SDPShowFindPanel(findPanel);
  200.                     SDPEnableFindPanel(findPanel,true);
  201.                     
  202.                     // update ok button
  203.                     
  204.                     RecalcFindButton(theDlg,findPanel);
  205.                 }
  206.                 break;
  207.                 
  208.             case ok:
  209.                 if (gPanelKind==kBrowsePanel) {
  210.                 
  211.                     // browse panel ok hit
  212.                     
  213.                     SDPGetPanelSelectionState(browsePanel,&bSelectionState);
  214.                     if (bSelectionState==kSDPRecordSelected || bSelectionState==kSDPRecordAliasSelected)
  215.                         selectedRecord = true;
  216.                     else
  217.                         SDPOpenSelectedItem(browsePanel,&bPanelState);
  218.                 }
  219.                 else {
  220.                 
  221.                     // find panel ok hit
  222.                     
  223.                     SDPGetFindPanelState(findPanel,&fPanelState);
  224.                     if ((**findPanel).nowFinding) {                    // stop the find
  225.                         SDPStopFind(findPanel);
  226.                         GetDItem(theDlg,ok,&iType,&iHndl,&iRect);
  227.                         if (fPanelState&kSDPItemIsSelectedMask)
  228.                             SetCTitle((ControlHandle)iHndl,kSelectText);
  229.                         else
  230.                             SetCTitle((ControlHandle)iHndl,kFindText);
  231.                     }
  232.                     else if (fPanelState&kSDPItemIsSelectedMask)        // select the item and exit
  233.                         selectedRecord = true;
  234.                     else if (fPanelState&kSDPFindTextExistsMask) {        // start a find
  235.                         SDPStartFind(findPanel);
  236.                     }
  237.  
  238.                 }
  239.                 break;
  240.         }
  241.     }
  242.     while (!selectedRecord && item!=cancel);
  243.     
  244.     // get selected record, if we have one
  245.     
  246.     if (selectedRecord) {
  247.         if (gPanelKind==kBrowsePanel)
  248.             err = SDPGetPanelSelectionSize(browsePanel,&dsSpecSize);
  249.         else
  250.             err = SDPGetFindPanelSelectionSize(findPanel,&dsSpecSize);
  251.         if (err==noErr) {
  252.             *dsSpec = (PackedDSSpecPtr)NewPtr(dsSpecSize);
  253.             if (MemError()==noErr) {
  254.                 if (gPanelKind==kBrowsePanel)
  255.                     err = SDPGetPanelSelection(browsePanel,*dsSpec);
  256.                 else
  257.                     err = SDPGetFindPanelSelection(findPanel,*dsSpec);
  258.             }
  259.             else err = MemError();
  260.         }
  261.     }
  262.     
  263.     // get info out for next call
  264.     
  265.     gHasBeenCalled = true;
  266.     SDPGetPath(browsePanel,&gInitialRLI,&gDSRefNum);
  267.     
  268.     // release stuff from memory
  269.     
  270.     SDPDisposePanel(browsePanel);
  271.     SDPDisposeFindPanel(findPanel);
  272.     DisposeDialog(theDlg);
  273.     
  274.     return selectedRecord;
  275. }
  276.  
  277.  
  278. pascal void PanelUserItem(DialogPtr theDlg,short item)
  279. {
  280.     #pragma unused (item)
  281.     long thePanel;
  282.     
  283.     thePanel = GetWRefCon((WindowPtr)theDlg);
  284.     
  285.     if (gPanelKind==kBrowsePanel)
  286.         SDPUpdatePanel((SDPPanelHandle)thePanel,nil);
  287.     else
  288.         SDPUpdateFindPanel((SDPFindPanelHandle)thePanel,nil);
  289. }
  290.  
  291.  
  292. pascal Boolean PanelFilterEvent(DialogPtr theDlg,EventRecord *ev,short *itemHit)
  293. {
  294.     char theChar;
  295.     long thePanel;
  296.     SDPPanelState bPanelState;
  297.     SDPFindPanelState fPanelState;
  298.     SDPFindPanelResult fPanelResult;
  299.     short iType;
  300.     ControlHandle iHndl;
  301.     Rect iRect;
  302.     Str255 cTitle;
  303.     OSErr err;
  304.     
  305.     // check for user cancel
  306.     
  307.     if (ev->what==keyDown) {
  308.         theChar = ev->message & charCodeMask;
  309.         if ((theChar==0x1b) || (theChar=='.' && ev->modifiers&cmdKey)) {
  310.             *itemHit = cancel;
  311.             FlashControl(theDlg,cancel);
  312.             return true;
  313.         }
  314.     }
  315.     
  316.     if (ev->what != updateEvt) {
  317.     
  318.         thePanel = GetWRefCon((WindowPtr)theDlg);
  319.         
  320.         if (gPanelKind==kBrowsePanel) {
  321.         
  322.             // browse panels
  323.             
  324.             RecalcBrowseButton(theDlg,(SDPPanelHandle)thePanel);
  325.             
  326.             SDPPanelEvent((SDPPanelHandle)thePanel,ev,&bPanelState);
  327.             if (bPanelState==kSDPSelectedAnItem) {
  328.                 *itemHit = ok;
  329.                 return true;
  330.             }
  331.         }
  332.         else {
  333.         
  334.             // find panels
  335.             
  336.             GetDItem(theDlg,ok,&iType,(Handle *)&iHndl,&iRect);
  337.             GetCTitle(iHndl,cTitle);
  338.             
  339.             SDPFindPanelEvent((SDPFindPanelHandle)thePanel,ev,&fPanelResult);
  340.             switch (fPanelResult) {
  341.                 case kSDPSelectedAFindItem:
  342.                     FlashControl(theDlg,ok);
  343.                     *itemHit = ok;
  344.                     return true;
  345.                     break;
  346.                 case kSDPFindSelectionChanged:
  347.                 case kSDPTextStateChanged:
  348.                 case kSDPFocusChanged:
  349.                 case kSDPSelectionAndFocusChanged:
  350.                 case kSDPSelectionAndMenuChanged:
  351.                     GetCTitle(iHndl,cTitle);
  352.                     if (EqualString(cTitle,kStopText,true,true))
  353.                         FlashControl(theDlg,ok);
  354.                     RecalcFindButton(theDlg,(SDPFindPanelHandle)thePanel);
  355.                     break;
  356.                 case kSDPProcessedFind:
  357.                     if ((**(SDPFindPanelHandle)thePanel).nowFinding) {
  358.                         GetCTitle(iHndl,cTitle);
  359.                         if (!EqualString(cTitle,kStopText,true,true)) {
  360.                             FlashControl(theDlg,ok);
  361.                             SetCTitle((ControlHandle)iHndl,kStopText);
  362.                         }
  363.                     }
  364.                     break;
  365.                 case kSDPFindCompleted:
  366.                     err = SDPGetFindPanelState((SDPFindPanelHandle)thePanel,&fPanelState);
  367.                     if ((err==noErr) && (fPanelState&kSDPItemIsSelectedMask))
  368.                         SetCTitle((ControlHandle)iHndl,kSelectText);
  369.                     else
  370.                         SetCTitle((ControlHandle)iHndl,kFindText);
  371.                     break;
  372.             }
  373.         }
  374.     }
  375.     else
  376.         MyDrawDefaultButtonOutline(theDlg,ok);
  377.     
  378.     return false;
  379. }
  380.  
  381.  
  382.  
  383. void RecalcBrowseButton(DialogPtr theDlg,SDPPanelHandle thePanel)
  384. {
  385.     SDPPanelState panelState;
  386.     short iType;
  387.     ControlHandle iHndl;
  388.     Rect iRect;
  389.     Str255 cTitle;
  390.     
  391.     SDPGetPanelSelectionState(thePanel,&panelState);
  392.     GetDItem(theDlg,ok,&iType,(Handle *)&iHndl,&iRect);
  393.     GetCTitle(iHndl,cTitle);
  394.  
  395.     switch (panelState) {
  396.         case kSDPNothingSelected:
  397.         case kSDPLockedContainerSelected:
  398.             if ((**iHndl).contrlHilite!=kDimmed) {
  399.                 HiliteControl(iHndl,kDimmed);
  400.                 MyDrawDefaultButtonOutline(theDlg,ok);
  401.             }
  402.             if (!EqualString(cTitle,kOpenText,true,true))
  403.                 SetCTitle(iHndl,kOpenText);
  404.             break;
  405.         case kSDPContainerSelected:
  406.         case kSDPContainerAliasSelected:
  407.             if ((**iHndl).contrlHilite!=kActive) {
  408.                 HiliteControl(iHndl,kActive);
  409.                 MyDrawDefaultButtonOutline(theDlg,ok);
  410.             }
  411.             if (!EqualString(cTitle,kOpenText,true,true))
  412.                 SetCTitle(iHndl,kOpenText);
  413.             break;
  414.         case kSDPRecordSelected:
  415.         case kSDPRecordAliasSelected:
  416.             if ((**iHndl).contrlHilite!=kActive) {
  417.                 HiliteControl(iHndl,kActive);
  418.                 MyDrawDefaultButtonOutline(theDlg,ok);
  419.             }
  420.             if (!EqualString(cTitle,kSelectText,true,true))
  421.                 SetCTitle(iHndl,kSelectText);
  422.             break;
  423.     }        
  424. }
  425.  
  426.  
  427. void RecalcFindButton(DialogPtr theDlg,SDPFindPanelHandle thePanel)
  428. {
  429.     Str255 cTitle;
  430.     short iType;
  431.     ControlHandle iHndl;
  432.     Rect iRect;
  433.     SDPFindPanelState fPanelState;
  434.     OSErr err;
  435.     
  436.     GetDItem(theDlg,ok,&iType,(Handle *)&iHndl,&iRect);
  437.     err = SDPGetFindPanelState(thePanel,&fPanelState);
  438.     if (err==noErr) {
  439.         switch (fPanelState) {
  440.             case kSDPItemIsSelectedMask:
  441.             case (kSDPItemIsSelectedMask|kSDPFindTextExistsMask):
  442.                 if ((**iHndl).contrlHilite!=kActive) {
  443.                     HiliteControl(iHndl,kActive);
  444.                     MyDrawDefaultButtonOutline(theDlg,ok);
  445.                 }    
  446.                 if (!EqualString(cTitle,kSelectText,true,true))
  447.                     SetCTitle(iHndl,kSelectText);
  448.                 break;
  449.             case kSDPFindTextExistsMask:
  450.                 if ((**iHndl).contrlHilite!=kActive) {
  451.                     HiliteControl(iHndl,kActive);
  452.                     MyDrawDefaultButtonOutline(theDlg,ok);
  453.                 }    
  454.                 if (!EqualString(cTitle,kFindText,true,true))
  455.                     SetCTitle(iHndl,kFindText);
  456.                 break;
  457.             default:
  458.                 if ((**iHndl).contrlHilite!=kDimmed) {
  459.                     HiliteControl(iHndl,kDimmed);
  460.                     MyDrawDefaultButtonOutline(theDlg,ok);
  461.                 }    
  462.                 if (!EqualString(cTitle,kFindText,true,true))
  463.                     SetCTitle(iHndl,kFindText);
  464.                 break;
  465.         }
  466.     }
  467. }
  468.  
  469.  
  470. /*------------------------------------------------------------------------------------*/
  471.  
  472. #define    kButtonFrameInset    -4
  473. #define    kButtonFrameSize    3
  474. #define    kCntrActivate        0
  475. #define    kColorPortMask        0xc000
  476. #define    kActivateControl    0
  477.  
  478. void MyDrawDefaultButtonOutline(DialogPtr theDialog,short theItem)
  479. {
  480.     short itemType;
  481.     Rect itemRect;
  482.     ControlHandle itemHandle;
  483.     PenState curPen;
  484.     short buttonOval;
  485.     RGBColor fgSaveColor,bgColor,newFGColor;
  486.     Boolean newGray;
  487.     WindowPtr oldPort;
  488.     Boolean isColor;
  489.     GDHandle targetDevice;
  490.     
  491.     // get the default button and draw a bold border around it
  492.     
  493.     GetDItem(theDialog,theItem,&itemType,(Handle *)&itemHandle,&itemRect);
  494.     GetPort(&oldPort);
  495.     SetPort((**itemHandle).contrlOwner);
  496.     GetPenState(&curPen);
  497.  
  498.     PenNormal();
  499.     InsetRect(&itemRect,kButtonFrameInset,kButtonFrameInset);
  500.     FrameRoundRect(&itemRect,16,16);
  501.  
  502.     buttonOval = ((itemRect.bottom-itemRect.top)/2) + 2;
  503.     if (((CGrafPtr)((**itemHandle).contrlOwner))->portVersion & kColorPortMask)
  504.         isColor = true;
  505.     else
  506.         isColor = false;
  507.     
  508.     if ((**itemHandle).contrlHilite != kActivateControl) {    // control is dimmed, so draw gray
  509.         newGray = false;
  510.         if (isColor) {
  511.             GetBackColor(&bgColor);
  512.             GetForeColor(&fgSaveColor);
  513.             newFGColor = fgSaveColor;
  514.             targetDevice = MyGetDeviceFromRect(&(**itemHandle).contrlRect);
  515.             newGray = GetGray(targetDevice,&bgColor,&newFGColor);
  516.         }
  517.         if (newGray)
  518.             RGBForeColor(&newFGColor);
  519.         else
  520.             PenPat(&qd.gray);
  521.         PenSize(kButtonFrameSize,kButtonFrameSize);
  522.         FrameRoundRect(&itemRect,buttonOval,buttonOval);
  523.         if (isColor)
  524.             RGBForeColor(&fgSaveColor);
  525.     }
  526.     else {
  527.         PenPat(&qd.black);
  528.         PenSize(kButtonFrameSize,kButtonFrameSize);
  529.         FrameRoundRect(&itemRect,buttonOval,buttonOval);
  530.     }
  531.     
  532.     SetPenState(&curPen);
  533.     SetPort(oldPort);
  534. }
  535.  
  536.  
  537. GDHandle MyGetDeviceFromRect(Rect *localRect)
  538. {
  539.     GDHandle device;
  540.     Point wCenter;
  541.     
  542.     wCenter.v = localRect->bottom-localRect->top;
  543.     wCenter.h = localRect->right-localRect->left;
  544.     LocalToGlobal(&wCenter);
  545.     
  546.     device = GetDeviceList();
  547.     while (device) {
  548.         if (PtInRect(wCenter,&(**device).gdRect))
  549.             return device;
  550.         device = GetNextDevice(device);
  551.     }
  552.     
  553.     return GetMainDevice();
  554. }
  555.  
  556.  
  557. void FlashControl(DialogPtr theDialog,short item)
  558. {
  559.     short iType;
  560.     ControlHandle iHndl;
  561.     Rect iRect;
  562.     long fTicks;
  563.         
  564.     GetDItem(theDialog,item,&iType,(Handle *)&iHndl,&iRect);
  565.     HiliteControl(iHndl,inButton);
  566.     Delay(8,&fTicks);
  567.     HiliteControl(iHndl,0);
  568. }